package com.example.ddd.domain.service;

import com.example.ddd.domain.model.Order;
import com.example.ddd.domain.model.OrderItem;

/**
 * 订单领域服务 - 包含不属于特定实体或值对象的领域逻辑
 */
public class OrderDomainService {
    
    // 验证订单是否可以提交
    public void validateOrderBeforeSubmit(Order order) {
        if (order == null) {
            throw new IllegalArgumentException("订单不能为空");
        }
        
        // 检查订单是否包含订单项
        if (order.getItems().isEmpty()) {
            throw new IllegalArgumentException("订单必须包含至少一个订单项");
        }
        
        // 检查订单总金额是否合理
        if (order.getTotalAmount() <= 0) {
            throw new IllegalArgumentException("订单总金额必须大于0");
        }
        
        // 检查每个订单项
        for (OrderItem item : order.getItems()) {
            validateOrderItem(item);
        }
    }
    
    // 验证订单项
    private void validateOrderItem(OrderItem item) {
        // 这里可以添加更复杂的验证逻辑
        // 例如检查商品库存、价格一致性等
        if (item.getQuantity() > 100) {
            throw new IllegalArgumentException("单个商品数量不能超过100");
        }
    }
    
    // 计算订单优惠金额
    public double calculateDiscount(Order order, String discountCode) {
        // 根据折扣码计算折扣金额的业务逻辑
        // 这是一个领域服务的典型例子，它涉及多个领域对象的协作
        
        if (discountCode == null || discountCode.isEmpty()) {
            return 0.0;
        }
        
        // 示例：VIP折扣
        if ("VIP10".equals(discountCode)) {
            return order.getTotalAmount() * 0.1;
        }
        
        // 示例：满减折扣
        if ("FULL500MINUS50".equals(discountCode) && order.getTotalAmount() >= 500) {
            return 50.0;
        }
        
        return 0.0;
    }
}